<?php

class template {
	protected $templateDir;
	protected $templateVar;
	protected $templateName;
	
	protected $js;
	protected $css;
	protected $meta;
	
	protected $icon;
	protected $doctype;
	protected $htmlTag;
	protected $title;

	protected $header;
	protected $body;
	
	protected $errorReturn;
	
	/**
	 * Diese Methode wird beim initieren der Klasse verwendet
	 * @param object $dir [optional] Pfad zum Template-Verzeichnis; default = ./template/
	 * @param object $err [optional] Fehlerreporting aktieren durch eingabe von true; default = false
	 * @return 
	 */
	public function __construct($dir='./template/', $err=false) {
		if(substr($dir, -1, 1) != '/') {
			$dir.='/';
		}		
		$this->templateDir = $dir;
		$this->errorReturn = $err;
	}
	
	/**
	 * Sucht den Suffix einer Datei
	 * @param object $file Dateipfad
	 * @return string
	 */
	private function Find_Suffix($file) {
		$fileParts = explode('.', $file);
		$lastPart = $fileParts[count($fileParts)-1];
		return strtolower($lastPart);
	}
	
	/**
	 * Ermittelt den Dateipfad und den Dateinamen aus einem String
	 * @param object $file
	 * @return array
	 */
	private function Find_Path_Parts($file) {
		$pathParts = explode('/', $file);
		$ret['name'] = $pathParts[count($pathParts)-1];
		unset($pathParts[count($pathParts)-1]);
		$ret['path'] = implode('/', $pathParts);
		return $ret;
	}
	
	/**
	 * Definiert die jQuery-Verzeichnise (jquery, ui, plugins)
	 * @param object $jqCore Verzeichnis der eigentlichen jQuery-Datei
	 * @param object $jqUi [optional] Verzeichnis für jQuery-UI
	 * @param object $jqPlugins [optional] Verzeichnis für Plugins von jQuery
	 */
	public function Define_JQuery($jqCore, $jqUi=false, $jqPlugins=false) {
		// Core
		$dir = $jqCore;
		if(substr($dir, -1, 1) != '/') {
			$dir .= '/';
		}
		$fopen = opendir($dir);
		while($fread = readdir($fopen)) {
			if(filetype($dir.$fread) == 'file' && $this->Find_Suffix($fread) == 'js') {
				$this->js[$fread] = $dir.$fread;
			}
		}
		
		// UI
		if($jqUi) {
			$dir = $jqUi;
			if(substr($dir, -1, 1) != '/') {
				$dir .= '/';
			}
			$fopen = opendir($dir);
			while($fread = readdir($fopen)) {
				if(filetype($dir.$fread) == 'file' && $this->Find_Suffix($fread) == 'js') {
					$this->js[$fread] = $dir.$fread;
				}
			}
		}
		
		// Plugins
		if($jqPlugins) {
			$dir = $jqPlugins;
			if(substr($dir, -1, 1) != '/') {
				$dir .= '/';
			}
			$fopen = opendir($dir);
			while($fread = readdir($fopen)) {
				if(filetype($dir.$fread) == 'file' && $this->Find_Suffix($fread) == 'js') {
					$this->js[$fread] = $dir.$fread;
				}
			}
		}
	}
	
	/**
	 * Definiert eine Template-Variable
	 * @param object $var Syntax der Variable; üblich {$var}
	 * @param object $value Inhalt durch den die Variable ersetzt werden soll
	 */
	public function Define_TemplateVar($var, $value) {
		if(isset($this->templateVar[$var])) {
			$this->templateVar[$var] = $value;
		}
	}
	
	/**
	 * Fügt dem Header der Template eine JavaScript-Datei hinzu
	 * @param object $file Dateipfad u. -bezeichnung
	 */
	public function Add_JS($file) {
		$parts = $this->Find_Path_Parts($file);
		$this->js[$parts['file']] = $file;
	}
	
	/**
	 * Fügt dem Header der Template eine CSS-Datein hinzu
	 * @param object $file Dateipfad u. -bezeichnung
	 * @return 
	 */
	public function Add_CSS($file) {
		$parts = $this->Find_Path_Parts($file);
		$this->css[$parts['file']] = $file;
	}
	
	/**
	 * Definiert das Fav-Icon im Template-Header
	 * TODO Variable wird nocht nicht verarbeitet
	 * @param object $file Dateipfad u. -bezeichnung
	 */
	public function Set_Icon($file) {
		$this->icon = $file;
	}
	
	/**
	 * Definiert die HTML-Doctype der Template; falls keine Doctype vor der Ausgabe definiert wurde, wird automatisch eine Standadt-Doctype verwenden
	 * @param object $doctype Doctype
	 */
	public function Set_Doctype($doctype) {
		$this->doctype = $doctype;
	}
	
	/**
	 * Definiert die HTML-Tags der Template; falls keine Tags vor der Ausgabe definiert wurden, wird automatisch ein Standardt-Tag eingefügt
	 * @param object $open Eröffnungs-Tag
	 * @param object $close Abschluss-Tag
	 */	
	public function Set_HtmlTag($open, $close) {
		$this->htmlTag['open'] = $open;
		$this->htmlTag['close'] = $close;
	}
	
	/**
	 * Definiert den Title-Tag der Template
	 * @param object $title Title-Tag
	 * @return 
	 */
	public function Set_Title($title) {
		$this->title = $title;
	}
	
	/**
	 * Definiert, welche Template geladen werden soll
	 * @param object $name Templatebezeichnung
	 */
	public function Set_Templatename($name) {
		$this->templateName = $name;
	}
	
	/**
	 * Liest den Ordner der ausgewählte Template und lädt die vorhandenen Dateien und Variablen
	 */
	public function read() {
		if(empty($this->templateName)) {
			$this->Set_Templatename('default');
		}
		
		$tmpDir = $this->templateDir.$this->templateName.'/';
		
		if(empty($this->doctype)) {
			$defDoctype .= "<?xml version=\"1.0\" ?>\n";
			$defDoctype .= "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
			$this->Set_Doctype($defDoctype);
		}
		
		if(empty($this->htmlTag)) {
			$open = "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n";
			$close = "</html>";
			$this->Set_HtmlTag($open, $close);
		}

		// JavaScript
		$dir = $tmpDir.'js/';
		if(is_dir($dir)) {
			$fopen = opendir($dir);
			while($fread = readdir($fopen)) {
				if(filetype($dir.$fread) == 'file' && $this->Find_Suffix($fread) == 'js') {
					$this->js[$fread] = $dir.$fread;
				}
			}
		}
		
		// CSS
		$dir = $tmpDir.'css/';
		if(is_dir($dir)) {
			$fopen = opendir($dir);
			while($fread = readdir($fopen)) {
				if(filetype($dir.$fread) == 'file' && $this->Find_Suffix($fread) == 'css') {
					$this->css[$fread] = $dir.$fread;
				}
			}
		}
		
		// Body
		$tmpFile = $tmpDir.$this->templateName.'.html';
		
		$read = file($tmpFile);
		foreach ($read as $nr => $line) {
			$this->body .= $line;
		}
		
		$isMatch = preg_match_all('/\{\$(.*?)\}/i', $this->body, $matches);
		if ($isMatch) {
			foreach ($matches[0] as $matchkey => $matchwert){
				$this->templateVar[$matchwert] = '<i>Not defined template-var: '.$matchwert.'</i>';
			}
		}
	}
	
	protected function _create() {
		// Header
		$this->header .= "<head>\n";
		$this->header .= "<title>".$this->title."</title>\n";
	
		// Meta
		if(!empty($this->meta)) {
			foreach ($this->meta as $key => $tag) {
				$this->header .= $tag."\n";
			}
		}
		
		//CSS
		if(!empty($this->css)) {
			foreach ($this->css as $key => $file) {
				$this->header .= "<link rel=\"stylesheet\" type=\"text/css\" href=\"$file\" />\n";
			}
		}
		unset($file);
		
		// JavaScript
		if(!empty($this->js)) {
			foreach ($this->js as $key => $file) {
				$this->header .= "<script type=\"text/javascript\" src=\"$file\"></script>\n";
			}
		}
		unset($file);
		
		$this->header .= "</head>\n";
		
		// Body
		if(is_array($this->templateVar)) {
			foreach ($this->templateVar as $search => $replace) {
				$this->body = str_replace($search, $replace, $this->body);
			}
		}
	}
	
	/**
	 * Setzt alle Elemente zusammen und liefert die fertige Template
	 * @return Template
	 */
	public function create() {
		$this->_create();
		
		$ret .= $this->doctype;
		$ret .= $this->htmlTag['open'];
		$ret .= $this->header;
		$ret .= $this->body;
		$ret .= $this->htmlTag['close'];
		
		return $ret;
	}
	
	protected function error($message) {
		echo "<div style=\"padding: 0 10px; border: 2px solid #eee;\">";
		echo "<pre>";
		echo "## topwork | Class: template ##\n\n";
		echo "-> ".$message;
		echo "</pre>";
		echo "</div>";
	}
}
